<?php
/**
 * [baseController]
 * 
 * base controller
 *
 * @package     light-php
 * @author      kamisiro.memo <kamisiro.memo@gmail.com>
 */
class baseController 
{
    /**
     * [req]
     *
     * request parameters
     *
     * @var     $req     request parameters 
     * @access  public 
     */
    var $req        = array();
    /**
     * [uses] 
     *
     * use models
     *
     * exsample.
     * array(
     *  'ExsampleModel'
     * )
     * 
     * @var array
     * @access public
     */
    var $uses       = array();
    /**
     * [components] 
     *
     * use components
     *
     * exsample.
     * array(
     *  'ExsampleComponent'
     * )
     * 
     * @var array
     * @access public
     */
    var $components = array();
    /**
     * [_viewVar] 
     *
     * ビューで使用する為の変数
     * 
     * @var array
     * @access public
     */
    var $_viewVar   = array();
    /**
     * [__construct]
     *
     * コンストラクタ
     * リクエストパラメータをメンバ変数に格納する
     * 更にモデルとコンポーネントをインスタンス化してメンバ変数に格納する
     *
     * @param  array   $req    リクエストパラメータ
     * @return none
     * @access public
     */
    public function __construct($req = array()) { 
        //リクエスト格納
        $this->req = $req; 

        //モデルインスタンス化
        if (count($this->uses) > 0) {
            foreach ($this->uses as $k => $model)  {
                $classname = $model . 'Model';
                require_once MODEL_ROOT_PATH . $model . '.php';
                $this->$model = new $classname($req);
            }
        }

        //コンポーネントインスタンス化
        if (count($this->components) > 0) {
            foreach ($this->components as $k => $component)  {
                require_once COMPONENT_ROOT_PATH . $component . '.php';
                $this->$component = new $component($req);
            }
        }
    }

    /**
     * [preExecute] 
     *
     * 各コントローラでオーバーライドして使うといい
     * executeの実行前に動く
     * 
     * @access public
     * @return void
     */
    public function preExecute()
    {
    }

    /**
     * [execute]
     *
     * 本処理
     *
     * @return none 
     * @access public
     */
    public function execute()
    {
    }

    /**
     * [afterExecute] 
     *
     * ビューをレンダリングする前に動く
     * 
     * @access public
     * @return void
     */
    public function afterExecute()
    {
    }

    /**
     * [render] 
     * 
     * @access public
     * @return void
     */
    public function render()
    {
        $res = $this->getViewParameters();
        require_once VIEW_ROOT_PATH . $this->_view_name . '.php';
    }

    /**
     * [setRequestParameters]
     *
     * リクエストパラメータをメンバ変数に格納する
     *
     * @param   array   $req    リクエストパラメータ
     * @access  public
     */
    public function setRequestParameters($req = array())
    {
        $this->req = $req; 
    }

    /**
     * [setViewName] 
     * 
     * @param mixed $view_name 
     * @access public
     * @return void
     */
    public function setViewName($view_name)
    {
        $this->_view_name = $view_name;
    }

    /**
     * [getRequestParameters]
     *
     * リクエストパラメータを取得する
     *
     * @return array    $this->req  リクエストパラメータ  
     * @access public
     */
    public function getRequestParameters()
    {
        return $this->req;
    }

    /**
     * [set] 
     *
     * VIEWで使うパラメータをセットする
     * 
     * @access public
     * @return void
     */
    public function set($param_name, $params = array())
    {
        $this->_viewVar[$param_name] = $params;
    }

    /**
     * [getViewParameters]
     *
     * @return array    $res    画面表示用配列
     * @access public
     */
    public function getViewParameters()
    {
        return $this->_viewVar;
    }
}
